home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SCLIB.ARJ / SCL1SAMP.EXE / EMS.C < prev    next >
Text File  |  1992-01-01  |  7KB  |  263 lines

  1. #include <memory.h>
  2. #include <dos.h>
  3. #include <scl1ems.h>
  4.  
  5.  
  6. /****************************************************
  7.     Shows the use of EMS (Expanded memory functions */
  8.  
  9. void HandleReport(void);
  10. void Pause(void);
  11. void PrintError(unsigned int Error);
  12.  
  13. char *TestStr[]={
  14.     "Data for Page 0",
  15.     "Data for Page 1",
  16.     "Data for Page 2",
  17.     "Data for Page 3",
  18.     };
  19.  
  20. typedef struct{
  21.     unsigned int ErrorCode;
  22.     char *ErrorMess;
  23.     }EMSERRORS;
  24.  
  25. EMSERRORS emse[]=
  26.     {
  27.     EMS_NOT_AVAILABLE       ,"EMS is not available",
  28.     EMS_INTERNAL_ERROR      ,"Internal EMM error",
  29.     EMS_HARDWARE_ERROR      ,"Hardware Error",
  30.     EMS_MANAGER_BUSY        ,"EMS Manager busy",
  31.     EMS_INVALID_HANDLE      ,"Invalid handle",
  32.     EMS_NOT_IMPLEMENTED     ,"Function is not implemented",
  33.     EMS_NO_MORE_HANDLE      ,"No more handles availables",
  34.     EMS_SAVE_REST_ERROR     ,"Save/restore error",
  35.     EMS_LOG_GREATER_PH      ,"Not enough physical pages",
  36.     EMS_LOG_GREATER_AVA     ,"Not enough available logical pages",
  37.     EMS_ZERO_ALLOC          ,"Allocation of 0 pages",
  38.     EMS_INVALID_LOG         ,"Invalid logical page number",
  39.     EMS_INVALID_PH          ,"Invalid physical page number",
  40.     EMS_STATE_SAVE_FULL     ,"Save Stack full",
  41.     EMS_SAVE_ALREADY        ,"Already saved",
  42.     EMS_RESTORE_FAIL        ,"Failure restoring",
  43.     EMS_S_NOT_IMPLEMENTED   ,"Subfunction number not implemented",
  44.     EMS_SOURCE_OVERWRITTEN  ,"Source overwritten",
  45.     EMS_SIZE_ERROR          ,"Size error",
  46.     EMS_OVERLAP             ,"Overlapping regions",
  47.     EMS_OFFSET_ERROR        ,"Offset error",
  48.     EMS_TOO_BIG             ,"Size too big",
  49.     EMS_OVERLAP_ERROR       ,"Overlapping error",
  50.     EMS_UNDEFINED_TYPE      ,"Undefined memory type",
  51.     EMS_DUPLICATE           ,"Duplicate handle name",
  52.     EMS_WRAP_ERROR          ,"Wrap error",
  53.     };
  54.  
  55. EMSMove emove;
  56. char HandleName[9]="SCL1V30";
  57.  
  58. main()
  59. {
  60. char buffer[80];
  61. int i,handle;
  62. unsigned int ppages,lpages;
  63. void far *p,far *s;
  64. void *t;
  65.  
  66. printf("\n\nSCL1 Version 3.0 Expanded Memory (EMS) Test\n");
  67.  
  68. /* Initialize expanded memory manager */
  69.  
  70. if(EMS_Init() != EMS_OK)
  71.     {
  72.  
  73.     /* no EMS available */
  74.  
  75.     printf("No EMS available\n");
  76.     exit(-1);
  77.     }
  78.  
  79.     /* Get EMM version number */
  80.  
  81. EMS_Version(&i);
  82. memset(buffer,0,sizeof(buffer));
  83.  
  84. /* use predefined macros to get the major and minor version number
  85.    add 0x30 to these values to convert to ASCII, store in buffer */
  86.  
  87. buffer[0]=EMS_MAJOR_VER(i) + 0x30;
  88. buffer[1]='.';
  89. buffer[2]=EMS_MINOR_VER(i) + 0x30;
  90.  
  91.      /* print version number */
  92.  
  93. printf("EMS version: %s\n",buffer);
  94.  
  95.      /* get EMM status and print answer */
  96.  
  97. printf("EMS status: ");
  98. if((i=EMS_Status())==EMS_OK)
  99.     printf("OK\n");
  100. else
  101.     PrintError(i);
  102.  
  103. Pause();
  104.  
  105.      /* get physical pages info */
  106.  
  107. printf("Physical pages report\n");
  108.  
  109.      /* get total number of physical pages */
  110.  
  111. EMS_TotalPhPages(&ppages);
  112. printf("\tTotal physical pages: %i\n",ppages);
  113.  
  114.      /* get each physical page address */
  115.  
  116. for(i=0;i < ppages;++i)
  117.      {
  118.      EMS_PageAddress(i,&p);
  119.      printf("\tPhysical page %i address %X:%X\n",i,FP_SEG(p),FP_OFF(p));
  120.      if(i > 0 && i % 21 == 0)
  121.         Pause();
  122.      }
  123.  
  124. Pause();
  125.  
  126.      /* get logical pages info */
  127.  
  128. printf("Logical pages report\n");
  129.  
  130.      /* get total number of logical pages */
  131.  
  132. EMS_TotalLogPages(&lpages);
  133. printf("\tTotal logical pages: %i\n",lpages);
  134.  
  135.      /* get number of available logical pages */
  136.  
  137. EMS_AvailableLogPages(&lpages);
  138. printf("\tAvailable logical pages: %i\n",lpages);
  139. Pause();
  140.  
  141. printf("Allocation/mapping/reallocation Test\n");
  142.  
  143. if(lpages)
  144.     {
  145.  
  146.     /* allocate all available memory */
  147.  
  148.     if((i=EMS_Alloc(&handle,lpages))==EMS_OK)
  149.         {
  150.         printf("\tSuccesful allocation of %i pages\n",lpages);
  151.  
  152.         if(EMS_SetHandleName(handle,HandleName)==EMS_OK)
  153.             {
  154.             printf("\tEMS handle has been named %s\n",HandleName);
  155.             if(EMS_GetNamedHandle(HandleName,&i)==EMS_OK)
  156.                 printf("\tHandle number is %i\n",i);
  157.             }
  158.  
  159.         /* print memory handle info */
  160.  
  161.         HandleReport();
  162.  
  163.         for(i=0;i < lpages,i < 4;++i)
  164.             {
  165.             printf("\tMapping Logical Page %i to Physical Page %i\n",i,i);
  166.             EMS_Map(handle,i,i);
  167.             EMS_PageAddress(i,&p);
  168.             printf("\tPhysical page %i segment: %X\n",i,FP_SEG(p));
  169.             printf("\tWriting to logical page %i\n",i);
  170.             _fmemcpy(p,TestStr[i],sizeof(TestStr[i]));
  171.             printf("\tCopying from expanded memory to conventional memory using EMS_Move\n");
  172.  
  173.             /* copy page 0 to our conventional memory buffer */
  174.  
  175.             emove.bytes=sizeof(TestStr[i]);
  176.             emove.stype=EMS_EXPANDED_MEM;
  177.             emove.shandle=handle;
  178.             emove.soffset=0;
  179.             emove.sseg=0;
  180.             emove.dtype=EMS_CONVENTIONAL_MEM;
  181.             emove.dhandle=0;
  182.             s=(void far *)buffer;
  183.             emove.doffset=FP_OFF(s);
  184.             emove.dseg=FP_SEG(s);
  185.             EMS_Move(&emove);
  186.  
  187.             /* compare our buffer with page 0 */
  188.  
  189.             if(_fmemcmp(p,(void far *)buffer,sizeof(TestStr[i]))==0)
  190.                 printf("\tLogical page %i copied to conventional memory, compares OK\n",i);
  191.             else
  192.                 printf("\tLogical page %i copied to conventional memory, error in compare\n",i);
  193.             Pause();
  194.             }
  195.  
  196.         /* re-allocate to 1 page (16Kb) */
  197.  
  198.         if((i=EMS_Realloc(handle,1))==EMS_OK)
  199.             {
  200.             printf("\tReallocated to 1 page\n");
  201.  
  202.             /* print memory handle info */
  203.  
  204.             HandleReport();
  205.             }
  206.  
  207.         /* free allocated memory */
  208.  
  209.         EMS_Free(handle);
  210.         }
  211.     else
  212.         printf("\tError allocating EMS %x\n",i);
  213.     }
  214. }
  215.  
  216. void HandleReport(void)
  217. {
  218. EMSHandle p[255];
  219. char buffer[9];
  220. int i;
  221.  
  222.      /* get number of active handles */
  223.  
  224. memset(buffer,0,sizeof(buffer));
  225.  
  226. EMS_GetHandleCount(&i);
  227. printf("\tHandle report\n");
  228. printf("\t\tActive handles: %i\n",i);
  229.  
  230.  /* print the number of memory pages associated with each handle */
  231.  
  232. if(EMS_GetAllHandlePages(p,&i)==EMS_OK)
  233.     {
  234.     while(i--)
  235.         {
  236.         EMS_GetHandleName(p[i].handle,buffer);
  237.         printf("\t\tHandle %s %i, %i pages\n",buffer,p[i].handle,p[i].pages);
  238.         }
  239.     }
  240. }
  241.  
  242. void Pause(void)
  243. {
  244. printf("-- more --");
  245. GetKey();
  246. printf("\r          \n");
  247. }
  248.  
  249. void PrintError(unsigned int Error)
  250. {
  251. int i;
  252.  
  253. for(i=0;i < sizeof(emse) /sizeof(EMSERRORS);++i)
  254.     {
  255.     if(emse[i].ErrorCode==Error)
  256.         {
  257.         printf("\t%s\n",emse[i].ErrorMess);
  258.         return;
  259.         }
  260.     }
  261. printf("\tUnknown error #%X\n",Error);
  262. }
  263.